home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Online / SpeakFreely / src / lpc10 / lpc_both.c < prev    next >
C/C++ Source or Header  |  2000-05-18  |  3KB  |  139 lines

  1. /***********************************************************************
  2. *
  3. *     NSA LPC-10 Voice Coder
  4. *
  5. *     Unix C Version 
  6. *
  7. *     5 November 1990
  8. *
  9. *************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include "lpcdefs.h"
  13. #include "config.ch"
  14. #include "common.h"
  15.  
  16. FILE *fdi, *fdo;
  17.  
  18. #define BUFSIZE 600
  19.  
  20. int count=0;
  21.  
  22. int tau[LTAU] = {
  23.   20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,
  24.     35,36,37,38,39,40,42,44,46,48,50,52,54,56,58,60,62,64,66,
  25.     68,70,72,74,76,78,80,84,88,92,96,100,104,108,112,116,120,
  26.     124,128,132,136,140,144,148,152,156
  27. };
  28.  
  29. int nframe, nfb, nbits, nunsfm, iclip, maxosp, NFBLK;
  30. FILE *fbi, *fbo, *fopen();
  31.  
  32. /* analys */
  33. float *inbuf, *pebuf, *lpbuf, *ivbuf;
  34. float lparray[LBUFH-LBUFL+1], ivarray[PWINH-PWINL+1];
  35. float pearray[SBUFH-SBUFL+1], inarray[SBUFH-SBUFL+1];
  36. int vwin[2][AF], awin[2][AF], voibuf[2][AF+1];
  37. float rmsbuf[AF], psi[MAXORD], rcbuf[MAXORD][AF];
  38. float amdf[LTAU];
  39. float phi[MAXORD][MAXORD];
  40.  
  41. /* bsynz.c */
  42. float exc[MAXPIT+MAXORD], exc2[MAXPIT+MAXORD];
  43. float noise[MAXPIT+MAXORD];
  44.  
  45. /* decode.c */
  46. int drc[3][MAXORD], dpit[3], drms[3];
  47.  
  48. /* dyptrk */
  49. float s[60];
  50. int p[60][2];
  51.  
  52. /* onset */
  53. float l2buf[16];
  54.  
  55. /* synths.c */
  56. int ipiti[11], ivuv[11];
  57. float rci[MAXORD][11], rmsi[11], pc[MAXORD];
  58.  
  59. main(argc,argv)
  60. int argc;
  61. char *argv[];
  62. {
  63. int         pitch;
  64. float            rms, rc[MAXORD];
  65. int            len;
  66. int voice[2];
  67.  
  68. short        eof;
  69. static float    speech[MAXFRM+MAXPIT];
  70.  
  71.     static long auhdr[] = {
  72.     0x2E736E64,
  73.     6 * 4,
  74.     ~0,
  75.     1,
  76.     8000,
  77.     1
  78.     };
  79.  
  80. int i; /* this is only for some debugging purposes */
  81.  
  82.   setup(argc,argv);
  83.  
  84.   fwrite(auhdr, sizeof auhdr, 1, fdo);
  85.  
  86.   initialize1();
  87.   initialize2();
  88.  
  89.   while (1) {
  90.  
  91.     if (fdi != NULL) 
  92.         diskio(0,fdi,speech,LFRAME,&eof,"",0);  
  93.     if(eof==END) break;
  94.  
  95.     hp100(speech);
  96.     analys(speech, voice, &pitch, &rms, rc-1);
  97.     trans(voice-1, &pitch, &rms, rc);
  98.  
  99.     /* Synthesize speech from received parameters */
  100.     synths(voice-1, &pitch, &rms, rc-1, speech-1, &len );
  101.  
  102.     /* Equalize to LFRAME samples for output */
  103.     buf_man(speech, speech, len);
  104.     diskio(1,fdo,speech,LFRAME,&eof,"",0);
  105.   }
  106.   return 0;
  107. }
  108.  
  109. /*----------------------------------------------------------------------*/
  110. buf_man(inbuffer, outbuffer, len)
  111. float outbuffer[], inbuffer[];
  112. int len;
  113. {
  114.     static float big_buffer[BUFSIZE];
  115.     static int sptr=0, eptr=360, first=1;
  116.     int i;
  117.     
  118.     /* Initialize pseudo-circular buffer */
  119.     if(first)    {
  120.         first = 0;
  121.         for(i=0;i<360;i++)
  122.           big_buffer[i] = 0.0;
  123.     }
  124.     
  125.     /* write new data to end of buffer */
  126.     for(i=0;i<len;i++)    {
  127.         big_buffer[eptr++] = inbuffer[i];
  128.         if (eptr == BUFSIZE) eptr = 0;
  129.         /*eptr = (eptr+1) % BUFSIZE;*/
  130.     }
  131.     
  132.     /* send next 180 samples */
  133.     for(i=0;i<LFRAME;i++)    {
  134.         outbuffer[i] = big_buffer[sptr++];
  135.         if(sptr == BUFSIZE) sptr = 0;
  136.         /*sptr = (sptr+1)%BUFSIZE;*/
  137.     }
  138. }
  139.